// 获取小数部分
const fractional = function (x) {
  x = Math.abs(x);
  return x - Math.floor(x);
}
const formatInt = function (x, len) {
  let result = '' + x;
  len = len - result.length;
  while (len > 0) {
    result = '0' + result;
    len--;
  }
  return result;
}

// 创建标准分幅网格
// west,south,east,north 传入要创建的标准分幅网格的经纬度范围
// scalem 表示比例尺的分母（例如 10000 表示 1:1万）
// 返回一个 geojson 对象
// solym ymwh@foxmail.com 2020年12月13日
function makeStandardMapGrids(west, south, east, north, scalem) {
  let lngDiff = 0;
  let latDiff = 0;
  let scaleCode = '';
  switch (scalem) {
    case 1000000:
      lngDiff = 6;
      latDiff = 4;
      break;
    case 500000:
      lngDiff = 3;
      latDiff = 2;
      scaleCode = 'B';
      break;
    case 250000:
      lngDiff = 1.5;
      latDiff = 1;
      scaleCode = 'C';
      break;
    case 100000:
      lngDiff = 0.5;
      latDiff = 1 / 3;
      scaleCode = 'D';
      break;
    case 50000:
      lngDiff = 0.25;
      latDiff = 1 / 6;
      scaleCode = 'E';
      break;
    case 25000:
      lngDiff = 0.125;
      latDiff = 1 / 12;
      scaleCode = 'F';
      break;
    case 10000:
      lngDiff = 0.0625;
      latDiff = 1 / 24;
      scaleCode = 'G';
      break;
    case 5000:
      lngDiff = 0.03125;
      latDiff = 1 / 48;
      scaleCode = 'H';
      break;
    default:
      return null;
  }
  const GridX0 = -180;
  const GridX1 = 180;
  const GridY0 = -88;
  const GridY1 = 88;
  let x0 = Math.max(GridX0, west);
  let y0 = Math.max(GridY0, south);
  let x1 = Math.min(GridX1, east);
  let y1 = Math.min(GridY1, north);
  if (((x1 - x0) < lngDiff) || ((y1 - y0) < latDiff)) {
    return null;
  }


  let features = [];
  let coordinates = [];
  // 计算标准分幅网格行列范围
  const col0 = parseInt((x0 - GridX0) / lngDiff);
  const col1 = parseInt((x1 - GridX0) / lngDiff);
  const row0 = parseInt((y0 - GridY0) / latDiff);
  const row1 = parseInt((y1 - GridY0) / latDiff);
  const millionRowCode = 'ABCDEFGHIJKLMNOPQRSTUV';
  for (let row = row0; row <= row1; row++) {
    let gy0 = GridY0 + row * latDiff;
    let gy1 = gy0 + latDiff;
    let gcy = (gy0 + gy1) * 0.5;    // 分幅中心点 y 坐标
    let millionRow = parseInt((gy0 - 0) / 4); // 1:100分幅行号
    let Hemisphere = '';   // 南北半球标志
    if (millionRow < 0) {
      millionRow = -1 - millionRow;
      Hemisphere = 'S';
    }
    for (let col = col0; col <= col1; col++) {
      let gx0 = GridX0 + col * lngDiff;
      let gx1 = gx0 + lngDiff;
      let gcx = (gx0 + gx1) * 0.5;    // 分幅中心点 x 坐标
      let millionCol = parseInt((gcx - GridX0) / 6) + 1;  // 1:100分幅列号(从1开始)
      coordinates = [[
        [gx0, gy0],
        [gx1, gy0],
        [gx1, gy1],
        [gx0, gy1],
        [gx0, gy0]
      ]];
      millionCol = (millionCol < 10) ? ('0' + millionCol) : millionCol;
      let gridID = Hemisphere + millionRowCode[millionRow] + millionCol;
      if (scaleCode != '') {
        // 计算当前分幅在 1:100万 分幅内的行列号
        // 注意，这里行列号从左向右，从北向南，从1开始编号
        let colID = parseInt((fractional((gcx - GridX0) / 6) * 6) / lngDiff) + 1;
        let rowID = parseInt((fractional((GridY1 - gcy) / 4) * 4) / latDiff) + 1;
        gridID += scaleCode + formatInt(rowID, 3) + formatInt(colID, 3);
      }
      let feature = {
        type: "Feature",
        geometry: {
          type: "Polygon",
          coordinates: coordinates
        },
        properties: {
          ID: gridID,
          fanwei: '西:' + gx0.toFixed(3) + ' 东:' + gx1.toFixed(3) + ' 南:' + gy0.toFixed(3) + ' 北:' + gy1.toFixed(3)
        }
      };
      features.push(feature);
    }
  }
  return {
    type: "FeatureCollection",
    features: features
  };
}

export {makeStandardMapGrids}